package com.junchao.peng.utils;

import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.UUID;

/**
 * @author oyyf
 */
@Service
public class UploadFileService {

    /**
     * 获取当前运行系统环境
     */
    private static final String OS_NAME = System.getProperty("os.name").toLowerCase();

    /**
     * 多文件上传就是调用了下面的文件上传方法
     * @param uploadFileS 上传的文件
     * @return 文件的url
     */
    public List<String> uploadFileS(MultipartFile[] uploadFileS, String[] urlS){
        List<String> fileUrlS=new ArrayList<>();
        int i=0;
        try {
            //无修改图片时不执行
            if (urlS != null) {
                //先遍历图片地址数组
                for (;i<urlS.length;i++){
                    //有图片地址，能匹配地址删除原文件
                    String fileUrl = uploadFile(uploadFileS[i], urlS[i]);
                    //将新图片地址到路径数组中
                    fileUrlS.add(fileUrl);
                }
            }
            //图片地址数组遍历完后继续遍历file数组
            for (;i<uploadFileS.length;i++){
                //没有图片地址，直接上传文件
                String fileUrl = uploadFile(uploadFileS[i], null);
                //将上传的图片地址添加到路径数组中
                fileUrlS.add(fileUrl);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return fileUrlS;
    }

    /**
     * 上传文件业务层
     * @param uploadFile 需要上传的文件
     * @param url 原文件地址 (可用于覆盖原文件)
     * @return  返回最新的文件资源路径
     * @throws IOException io错误
     */
    public String uploadFile(MultipartFile uploadFile, String url) throws IOException {

        if (uploadFile==null){
            //用户没选中文件直接返回原文件路径
            return url;
        }

        //文件名和后缀名处理
        //生成UUID,将生成的UUID的-踢掉
        String fileName=UUID.randomUUID().toString().replace("-","");
        //拿源文件的文件名
        String originalFilename = uploadFile.getOriginalFilename();
        //拿用户上传文件的后缀名
        originalFilename= Objects.requireNonNull(originalFilename).substring(originalFilename.lastIndexOf("."));
        //组合成新的文件名
        fileName=fileName+originalFilename;
        //文件处理
        File file=createFile(fileName,url);
        //执行上传
        uploadFile.transferTo(file);
        //组合并返回图片地址，第一段是图片服务器的访问地址(本机测试图片库)
        String fileUrl="http://127.0.0.1:8080/file/"+fileName;
        //日志输出
        LoggerFactory.getLogger(getClass()).info("上传图片的地址："+fileUrl);

        return fileUrl;
    }

    /**
     * 文件上传辅助类，判断是否需要创文件，覆盖原文件，以及系统路径
     * @param fileName  新文件名
     * @param url  以前的文件路径
     * @return 放回处理好的文件路径
     */
    private File createFile(String fileName,String url) throws IOException {
        //路径初始化
        String path="";
        if (OS_NAME.contains("windows")){
            //运行环境为 windows
            LoggerFactory.getLogger(getClass()).info("windows");
            //本机文件上传测试文件夹
            path="D:\\localhostTestImageS\\uploadImageS";
        }else {
            //运行环境为 linux
            LoggerFactory.getLogger(getClass()).info("linux");
            //服务器文件上传测试文件夹
            path="/home/Project/";
        }

        //文件夹判断
        File file=new File(path);
        if (!file.exists()){
            //创建该文件夹
            file.mkdirs();
            LoggerFactory.getLogger(getClass()).info("文件夹不存在创建该文件夹，路径："+file.getCanonicalPath());
        }else {
            //文件存在
            if (!file.isDirectory()){
                //不是文件夹就创建该文件夹
                file.mkdirs();
                LoggerFactory.getLogger(getClass()).info("文件夹不存在创建该文件夹，路径："+file.getClass().getResource("/").getPath());
            }
        }
        //判断是否需要删除文件
        deleteFile(url);
        //将上传的文件重命名
        file=new File(path,fileName);
        //返回最后的文件对象
        return file;
    }

    /**
     * 删除文件
     * @return  返处理提示
     */
    public String deleteFile(String url){
        if (url==null){
            LoggerFactory.getLogger(getClass()).info("没有原文件路径，不做删除处理");
            return "没有原文件路径，不做删除处理";
        }
        //去空格
        url=url.replace(" ","");
        if ("null".equalsIgnoreCase(url)|| "".equals(url)|| "undefined".equals(url)){
            LoggerFactory.getLogger(getClass()).info("没有原文件路径，不做删除处理");
            return "没有原文件路径，不做删除处理";
        }
        String path="";
        if (OS_NAME.contains("windows")){
            //运行环境为 windows
            LoggerFactory.getLogger(getClass()).info("windows");
            //中设数字媒体文件位置
            path="D:\\localhostTestImageS\\uploadImageS";
        }else {
            //运行环境为 linux
            LoggerFactory.getLogger(getClass()).info("linux");
            //中设数字媒体文件位置
            path="/home/Project/";
        }

        String fileName="";
        if (url.contains("/")){
            //将源文件资源路径中的文件名拿到
            fileName=url.substring(url.lastIndexOf("/")).replace("/","");
        }
        //初始化要被删除的文件对象
        File file=new File(path,fileName);
        if (file.exists()){
            //这个文件存在,删除这个文
            file.delete();
            LoggerFactory.getLogger(getClass()).info("删除了文件:"+fileName);
            return "删除成功";
        }
        LoggerFactory.getLogger(getClass()).info(path+"\\"+fileName+"文件不存在，请到该文件位置检查文件");
        return "删除失败";
    }
}
